package IO;

import java.io.*;
import java.util.Scanner;

public class IODemo9Search {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 1.先让用户指定要搜索的根目录
        System.out.println("请输入从哪个目录开始搜索：");
        File rootDir = new File(scanner.next());
        //判断一下目录是否存在
        if(!rootDir.isDirectory()) {
            System.out.println("输入的目录不存在");
            return;
        }

        // 2.让用户指定一个要搜索的词
        System.out.println("请输入要查找的词：");
        String word = scanner.next();

        // 3.递归的进行目录/文件的遍历

        scanDir(rootDir,word);
    }

    private static void scanDir(File rootDir, String word) {
        //列出当前目录的文件，没有文件，直接递归结束
        File[] files = rootDir.listFiles();

        //递归先写出递归结束的条件
        if(files == null) {
            // 当前 rootDir 是一个空的目录, 这里啥都没有.
            // 没必要往里递归了
            return;
        }

        //遍历目录中的每一个元素，也就是文件夹中的内容，有可能是文件，也有可能是文件夹
        for (File f:files) {
            System.out.println("当前搜索到" + f.getAbsoluteFile());  //打印一个当前搜索到哪的日志
            if(f.isFile()) {
                // 是普通文件
                // 打开文件, 读取内容, 比较看是否包含上述关键词
                String content = readFile(f);
                if(content.contains(word)) {
                    System.out.println(f.getAbsoluteFile() + " 包含要查找的关键词");
                }
            }else if(f.isDirectory()) {
                //如果是一个文件夹，继续进行递归进行 （等同于二叉树访问）
                scanDir(f,word);
            }else {
                // 不是普通文件, 也不是目录文件, 直接跳过  (在linux系统中包括很多种类的文件，除了以上两种)
                continue;
            }
        }
    }

    private static String readFile(File f) {
        // 读取文件的整个内容, 返回出来.
        // 使用字符流来读取. 由于咱们匹配的是字符串, 此处只能按照字符流处理, 才是有意义的.
        StringBuilder stringBuilder = new StringBuilder();
        try(Reader reader = new FileReader(f)) {  //从文件f中读
            while(true) {
                int c = reader.read();
                if(-1 == c) {
                    break;
                }
                stringBuilder.append((char)c);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return stringBuilder.toString();
    }
}
